home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / tcp / amitcpfinger.lha / finger / net.c < prev    next >
C/C++ Source or Header  |  1993-08-10  |  4KB  |  141 lines

  1. /*
  2.  * Copyright (c) 1989 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #ifndef lint
  38. static char sccsid[] = "@(#)net.c    5.5 (Berkeley) 6/1/90";
  39. #endif /* not lint */
  40.  
  41. #include <sys/types.h>
  42. #include <sys/socket.h>
  43. #include <bsdsocket.h>
  44. #include <netinet/in.h>
  45. #include <netdb.h>
  46. #include <stdio.h>
  47. #include <ctype.h>
  48. #include <inline/socket.h>
  49.  
  50. netfinger(name)
  51.     char *name;
  52. {
  53.     extern int lflag;
  54.     register int c, lastc;
  55.     struct in_addr defaddr;
  56.     struct hostent *hp, def;
  57.     struct servent *sp;
  58.     struct sockaddr_in sin;
  59.     int s;
  60.     char *alist[1], *host, *rindex();
  61.     u_long inet_addr();
  62.  
  63.     if (!(host = rindex(name, '@')))
  64.         return;
  65.     *host++ = NULL;
  66.     if (!(hp = gethostbyname(host))) {
  67.         defaddr.s_addr = inet_addr(host);
  68.         if (defaddr.s_addr == -1) {
  69.             (void)fprintf(stderr,
  70.                 "finger: unknown host: %s\n", host);
  71.             return;
  72.         }
  73.         def.h_name = host;
  74.         def.h_addr_list = alist;
  75.         def.h_addr = (char *)&defaddr;
  76.         def.h_length = sizeof(struct in_addr);
  77.         def.h_addrtype = AF_INET;
  78.         def.h_aliases = 0;
  79.         hp = &def;
  80.     }
  81.     if (!(sp = getservbyname("finger", "tcp"))) {
  82.         (void)fprintf(stderr, "finger: tcp/finger: unknown service\n");
  83.         return;
  84.     }
  85.     sin.sin_family = hp->h_addrtype;
  86.     bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
  87.     sin.sin_port = sp->s_port;
  88.     if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) {
  89.         perror("finger: socket");
  90.         return;
  91.     }
  92.  
  93.     /* have network connection; identify the host connected with */
  94.     (void)printf("[%s]\n", hp->h_name);
  95.     if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
  96.         perror("finger: connect");
  97.         (void)s_close(s);
  98.         return;
  99.     }
  100.     
  101.     /* -l flag for remote fingerd  */
  102.     if (lflag)
  103.         (void)send(s, "/W ", 3, 0);
  104.     /* send the name followed by <CR><LF> */
  105.     (void)send(s, name, strlen(name),0);
  106.     (void)send(s, "\r\n", 2,0);
  107.  
  108.     /*
  109.      * Read from the remote system; once we're connected, we assume some
  110.      * data.  If none arrives, we hang until the user interrupts.
  111.      *
  112.      * If we see a <CR> or a <CR> with the high bit set, treat it as
  113.      * a newline; if followed by a newline character, only output one
  114.      * newline.
  115.      *
  116.      * Otherwise, all high bits are stripped; if it isn't printable and
  117.      * it isn't a space, we can simply set the 7th bit.  Every ASCII
  118.      * character with bit 7 set is printable.
  119.      */ 
  120.     while ((c = sgetc(s)) != EOF) {
  121.             c &= 0x7f;
  122.         if (c == 0x0d) {
  123.             c = '\n';
  124.             lastc = '\r';
  125.         } else {
  126.             if (!isprint(c) && !isspace(c))
  127.                 c |= 0x40;
  128.             if (lastc != '\r' || c != '\n')
  129.                 lastc = c;
  130.             else {
  131.                 lastc = '\n';
  132.                 continue;
  133.             }
  134.         }
  135.         putchar(c);
  136.     }
  137.     if (lastc != '\n')
  138.         putchar('\n');
  139.     s_close(s);
  140. }
  141.